/*
  多态、抽象类的使用
    多态是面向对象特征之一，面向对象的三大特征 封装 继承 和多态

  多态概念：父类定义一个方法不去实现、让继承它的子类去实现，每一个子类有不同的表现

  抽象类：抽象类也是一种多态形式，但是抽象类的要求是更加的严格的，抽象类要求如下：
    1： 使用 abstract 关键字来定义抽象类，抽象方法
    2.  抽象类是只能是一个基类，也可以理解成是模板，是不能够实例化的
    3.  抽象类的抽象方法也是一样不会有具体的体现，是给子类去实现
    4.  抽象类必须至少需要有一个抽象方法，继承抽象类的子类一定要重写抽象方法
*/

class animal {
  name: string
  constructor(name: string) {
    this.name = name
  }
  eat() {
    console.log('吃的方法')
  }
}
class dog extends animal {
  constructor(name: string) {
    super(name)
  }
  eat() {
    console.log(`${this.name}吃骨头`)
  }
}
class cat extends animal {
  constructor(name: string) {
    super(name)
  }
  eat() {
    console.log(`${this.name}吃鱼`)
  }
}
let bigDog = new dog('哈士奇')
bigDog.eat() // 哈士奇吃骨头
let smallCat = new cat('小花猫')
smallCat.eat() //  小花猫吃鱼

abstract class personl {
  age: string
  constructor(age: string) {
    this.age = age
  }
  abstract getage(): any
}

class students extends personl {
  constructor(age: string) {
    super(age)
  }
  getage() {
    console.log(`${this.age}的年龄是‘9784`)
  }
}
let teacher = new students('张老师')
teacher.getage() // 张老师的年龄是‘9784
/*
  总而言之 抽象类就是一个更加严格的多态的体现形式
*/
